#include <vector>
#include <string>

using namespace std;
// 核心思想：我们只需要关心每个字符应该放到哪一行
// 列的位置是无关紧要的，因为最终结果只要求按行拼接

// 错误的做法：试图手动计算和管理列索引 (col, flag_col, col_index)
// 这不仅增加了代码的复杂性，还容易导致内存越界等错误

// 正确的做法：
// 1. 使用一个 vector<string> 或 vector<vector<char>> 来存储每一行的字符
// 2. 我们只需要一个变量 (row) 来跟踪当前字符应该放入的行
// 3. 使用一个方向变量 (flag) 来控制下一个字符是向下一行还是向上一行
// 4. 对于每一行，直接将字符添加到该行的末尾 (push_back)
//    这会自动处理列的顺序，我们完全不需要关心它

// 总结：解决这个问题，关键是管理好“行”和“方向”，列会被自动处理
class Solution {
public:
    string convert(string s, int numRows) {
  if (numRows == 1 || numRows >= s.size()) {
            return s;
        }

        vector<vector<char>> vvc;
        vvc.resize(numRows); 

        int row = 0;
        int flag = 1; 
        for (auto e : s) {
            
            vvc[row].push_back(e);
            
            
            row += flag;
            
          
            if (row == 0) {
                flag = 1;
            } else if (row == numRows - 1) {
                flag = -1;
            }
        }

        string ret;
        for (int i = 0; i < vvc.size(); i++) {
            for (int j = 0; j < vvc[i].size(); j++) {
                ret += vvc[i][j];
            }
        }
        return ret;
    }
};